لدي قائمة بالأوقات بالثواني مثل: L = [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848 ، 3.14781922 ، 3.63637958 ، 5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352 ، 8.52988247 ، 8.83068894 ، 10.07690977 ، 11.53867284 ، 12.01214112 ، 12.13307653] لكل نافذة بطول ثانيتين تبدأ من الحد الثاني ، أود إخراج قائمة بجميع الأوقات التي تقع ضمن النافذة الثانية الثانية. لذلك بالنسبة للمثال أعلاه سيكون: [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061] [1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848] [2.71525848 ، 3.14781922 ، 3.63637958] [3.14781922 ، 3.63637958] [5.11147358، 5.97497864] [5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917] [6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352] [7.65215123 ، 7.86108352 ، 8.52988247 ، 8.83068894] [8.52988247، 8.83068894] [10.07690977] [10.07690977 ، 11.5386728] [11.5386728 ، 12.01214112 ، 12.13307653] [12.01214112 ، 12.13307653] بشكل عام ، قد يختلف طول النافذة عن 2. كيف يمكنك أن تفعل هذا؟
2021-01-31 08:10:29
أعتقد أنك تقصد الزيادة بناءً على "لكل نافذة طولها ثانيتان تبدأ من الحد الثاني" وليس التداخل. نفس الشيء بالنسبة لفترتين زمنيتين ، ولكن بما أنك تريد تغيير الطول ، فإن التداخل لمدة ثانية واحدة سيكون 0-3 ، 2-5 ، 4-7 ، لكن الزيادة تعني 0-3 ، 1-4 ، 2- 5. ومع ذلك ، كان من المثير للاهتمام معرفة الحلول لكليهما فقط في حالة. بافتراض أن L مرتبة وأن جميع العناصر موجبة وأن الفواصل الزمنية الثانية تبدأ جميعها بأعداد صحيحة ، يمكننا استخدام هذه الطريقة: استيراد الرياضيات من مجموعات استيراد defaultdict L = [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848 ، 3.14781922 ، 3.63637958 ، 5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352 ، 8.52988247 ، 8.83068894 ، 10.07690977 ، 11.53867284 ، 12.01214112 ، 12.13307653] my_ranges = defaultdict (قائمة) interal_width = 2 لـ x بـ L: upper_bound = math.ceil (x) Lower_bound = upper_bound - الفاصل_العرض Lower_bound = max (0، less_bound) لـ y في النطاق (Lower_bound، upper_bound): my_ranges [y]. ملحق (x) لـ in مصنفة (my_ranges): طباعة (my_ranges [أ]) لا أعرف ما إذا كنت تريد معرفة ما إذا كانت هناك أي نطاقات فارغة. لكن الديكت الافتراضي يطبع نطاقات فارغة إذا كنت تريد أيضًا. استخدم هذا السطر بدلاً من "لـ in Sorted": لنطاق في (min (my_ranges)، max (my_ranges) + 1): إذا كنت تريد النطاقات 0-3 ، 2-5 ، 4-7 ، فهذا يعمل: استيراد الرياضيات من مجموعات الاستيراد الافتراضي ديكت L = [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848 ، 3.14781922 ، 3.63637958 ، 5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352 ، 8.52988247 ، 8.83068894 ، 10.07690977 ، 11.53867284 ، 12.01214112 ، 12.13307653] interal_width = 2 my_ranges_2 = الافتراضي (قائمة) لـ x بـ L: definitely_in = (x // (الفاصل_العرض - 1)) * (الفاصل_العرض - 1) # سيكون الحد الأدنى لمضاعف الفاصل الزمني أدناه x دائمًا #print ("Adding"، x، "to"، definitely_in) my_ranges_2 [definitely_in]. ملحق (x) إذا كان x أفترض أن أطوال النوافذ هي أعداد صحيحة ، وإذا لم يكن الأمر كذلك ، فلدينا الكثير لنفعله ، لأن الرقم قد يذهب في أكثر من مصفوفة واحدة. ربما يمكننا الحصول على حلقة while ، التي تزداد بمقدار (period_width - 1) #print ("++ Adding"، x، "to"، definitely_in - الفاصل_العرض + 1) my_ranges_2 [definitely_in - الفاصل_العرض + 1]. ملحق (x) لـ في (my_ranges_2): طباعة (a، my_ranges_2 [a]) # طباعة (my_ranges_2 [a]) أظن أن هناك بعض التفاصيل التي نسيتها ، ولكن آمل أن تتمكن من تعديل الفاصل الزمني حسب الحاجة للتأكد من أن الكود الخاص بي يفعل ما كنت تأمله ويعلمني بالضبط ما تحتاجه | الحل المحتمل الذي يمكنني اقتراحه هو "فعال" بمعنى أنه يتكرر مرة واحدة فقط من خلال بيانات الإدخال وليس له تبعيات. التكلفة ، بالطبع ، هي أنها مكتوبة بلغة بيثون خالصة (قد يكون هناك كود أكثر تحسينًا) وأنها تقدم المزيد من متغيرات التتبع لمنع التكرار (وبالتالي فهي أقل بيثونية). def sliding_window (البيانات ، المدة ، البداية = 0 ، التداخل = 1): النتيجة = [] data_idx = 0 result_idx = 0 العلوي = البداية + المدة أقل = بداية next_lower = علوي - تداخل # المساعد الداخلي لحشو القوائم الداخلية الفارغة حتى نقطة الإدخال والإدراج def pad_and_append (في): بينما لين (النتيجة) <= في: result.append ([]) نتيجة [at]. append (data [data_idx]) # التكرار من خلال بيانات الإدخال بينما data_idxأ: إذا كانت س <ب: binned [k]. append (x) آخر: كسر إهمال defaultdict (قائمة ، {"0: 2": [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061] ، "1: 3": [1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848] ، "2: 4": [2.71525848 ، 3.14781922 ، 3.63637958] ، "3: 5": [3.14781922 ، 3.63637958] ، "4: 6": [5.11147358 ، 5.97497864] ، "5: 7": [5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917] ، "6: 8": [6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352] ، "7: 9": [7.65215123 ، 7.86108352 ، 8.52988247 ،8.83068894] ، "8:10": [8.52988247 ، 8.83068894] ، "9:11": [10.07690977] ، '10: 12 ': [10.07690977 ، 11.53867284] ، '11: 13 ': [11.53867284 ، 12.01214112 ، 12.13307653] ، '12: 14 ': [12.01214112، 12.13307653]}) | آمل أن أكون قد حصلت على السؤال بشكل صحيح ، فأنت تريد أساسًا أن تكون بياناتك مقسمة وفقًا لنوافذ زمنية مدتها ثانيتان ، مع تداخل ثانية واحدة؟ ثم قد يكون هذا خيارًا: استيراد numpy كـ np L = [0.10218048 ، 1.20851996 ، 1.46800021 ، 1.73429061 ، 2.71525848 ، 3.14781922 ، 3.63637958 ، 5.11147358 ، 5.97497864 ، 6.35469013 ، 6.80623747 ، 6.99571917 ، 7.65215123 ، 7.86108352 ، 8.52988247 ، 8.83068894 ، 10.07690977 ، 11.53867284 ، 12.01214112 ، 12.13307653] L = np.array (L) lim = [] بالنسبة لـ i في النطاق (0 ، int (np.ceil (L [-1])) ، 1): # تغيير معلمة النطاق الأول لـ t0 الأخرى # تغيير معلمة النطاق الثالث لخطوة أخرى lim + = [[i، i + 2]] # قم بتغيير "+2" إلى dt الذي تريده لـ l in lim: طباعة (L [(L> = l [0]) & (L = i) & (L